/**
 * 函数是由函数名、函数体、函数的参数、函数返回值组成
 * 函数的定义：TS中定义函数有三种
 * 1、声明式函数的定义
 * 语法：
 * function 函数名(参数1:类型注解,参数2:类型注解):返回值类型注解{
 * }
 * 2、函数表达式的定义
 * 1)只约束参数和返回类型
 * 语法：
 * const 变量名=function(参数1:类型注解,参数2:类型注解):返回值类型注解{
 *   [return 返回值]
 * }
 * 2) 只约束变量
 * const 变量名:(参数1:类型注解,参数2：类型注解)=>返回值类型注解 =function(参数1，参数2){
 *  
 * }
 * 3)同时约束变量和参数以及返回类型
 * const 变量名:(参数1:类型注解,参数2：类型注解)=>返回值类型注解 =function(参数1:类型注解，参数2：类型注解):返回值类型注解{
 *  
 * }
 * 3、箭头函数的定义
 * 1)只约束参数和返回值
 * const 变量=(参数1：类型注解,参数2：类型注解):返回值类型=>{}
 * 2) 只约束变量
 */
function fn1(arg1:number,arg2:string):number{
    return arg1+~~arg2
}

const fn2=function(arg1:number,arg2:string):number{
    return arg1+ +arg2
}
type Fn1=(arg1:number,arg2:string)=>number

const fn3:Fn1=function(arg1,arg2){
    return arg1+~~arg2
}

const fn4:(arg1:number,arg2:string)=>number=function(arg1:number,arg2:string):number{
    return arg1+~~arg2   
}
const fn5=(arg1:number,arg2:string):number=>arg1+~~arg2
console.log(fn5(12,'33'));

const fn6:Fn1=(arg1,arg2)=>arg1+~~arg2
console.log(fn6(22,'22'));

/**
 * 可选参数
 * 在ts中如果规定了几个参数就必须要传几个参数，不能省略或者多写，还要位置和类型对象
 */
function fn7(arg1:number,arg2:string,arg3:boolean,arg4:Array<string>,arg5:number){

}

fn7(90,"Giles",true,["Monica","Jerry"],1001) 


function introduce(name:string,age?:(string|number)){
    return `我叫${name} ${age!=undefined?`我今年${age}岁`:''}`
}

console.log(introduce('Giles',39));
console.log(introduce('jerry'));

/*
    如果一个函数没有返回值类型就是void
*/

function fn8(arg1:number,arg2:string):void{
    console.log(arg1+arg2)
}
console.log(fn8(22,'22'));

/**
 * 类型推论
 * 第1种情况：声明变量的时候，如果你给变量赋了值，这个时候变量后面的类型注解就可以省略
 * 第2种情况：函数的返回值类型不用写，因为类型推论的
 * 在ts能用类型就用
 */
let var11="Giles"
function fn9(arg1:string,arg2:number){
    return arg1+arg2
}

let result=fn9('22',23)








